Skip to content

fix: make global hotkey press-and-hold reliable - #113

Merged
douglasjarquin merged 24 commits into
mainfrom
codex/issue-82
Aug 18, 2026
Merged

fix: make global hotkey press-and-hold reliable#113
douglasjarquin merged 24 commits into
mainfrom
codex/issue-82

Conversation

@douglasjarquin

@douglasjarquin douglasjarquin commented Aug 18, 2026

Copy link
Copy Markdown
Owner

Closes #82

Implements reliable press-and-hold global dictation for the configured Carbon shortcut.

Summary:

  • Adds typed Carbon press and release edges with generation fencing and actionable registration errors.
  • Preserves keyboard intent across permission, Speech, audio startup, finalization, cleanup, and insertion without cancellation-based release handling.
  • Uses the canonical Shift-Command-Space default, native readable AppKit recording, key code 0 support, conflict validation, and atomic replacement/restoration.
  • Wires registration and persistence failures through onboarding, Settings, and menu-bar status.
  • Keeps the menu-bar Start Dictation / Stop Dictation action as a mouse-driven toggle.

Verification:

  • Exact head SHA: 6b858bfdfeec00b8f419dfaf61d37cfefafb3f4a.
  • Current base SHA: 95f28920dacb3ca03afa0ccf03eace316c0ed45a.
  • Resolved current-main conflicts in workflow, package manifest, app delegate, onboarding, and Settings, and restored merged lifecycle sources to the Xcode target.
  • Corrected non-sequential Carbon numeric key-code presentation with a RED/GREEN regression.
  • 14 deterministic issue [V1 Phase 0 · P0] Make the global hotkey press-and-hold reliable #82 scenarios pass, with full contract, lint, diff, static, and diagnostics receipts.
  • Exact Release Oigo.app build, launch, frontmost TextEdit observation, and cleanup receipts pass on macOS 26+.
  • Native global-edge, permission-backed recording, focus/insertion, and host-customized shortcut probes remain explicitly INCONCLUSIVE where unavailable.
  • No TCC, Accessibility, Input Monitoring, shared defaults, global key events, or host-process state was mutated.

douglasjarquin and others added 24 commits August 18, 2026 04:55
Establish the isolated OigoHotKey target and executable contract surface before changing shortcut behavior. Preserve the existing registrar semantics while making the app and Xcode project consume the new module.

Plan: .omo/plans/issue-82-global-hotkey.md
Expose typed Carbon edge events through a generation-fenced registrar with non-destructive probes and replacement ordering. Keep failed candidates from displacing the active registration and make registration failures actionable.

Plan: .omo/plans/issue-82-global-hotkey.md
Track keyboard ownership and startup release intent independently from coordinator state. Suppress duplicate and repeat edges while making processing-state input explicit and keeping mouse-owned recordings isolated.

Plan: .omo/plans/issue-82-global-hotkey.md
Use Shift-Command-Space as the single shipped default, migrate only the legacy Option-Command-Space value, and allow key code zero with supported modifiers. Expose the same readable presentation through the core shortcut contract.

Plan: .omo/plans/issue-82-global-hotkey.md
Capture shortcuts through an AppKit first-responder control with readable modifier glyphs, key-code-zero support, repeat suppression, validation feedback, and Escape restoration. Keep capture local to the explicit recorder surface.

Plan: .omo/plans/issue-82-global-hotkey.md
Route Carbon press and release edges through a keyboard-owned intent bridge, preserve release through asynchronous startup, and share normal stop/finalization with the mouse toggle without canceling on release.

Plan: .omo/plans/issue-82-global-hotkey.md
Use the native recorder in onboarding and Settings, preserve unsaved candidates on close, and surface registration state and actionable failures through the windows and menu bar. Commit settings only after the working shortcut replacement succeeds.

Plan: .omo/plans/issue-82-global-hotkey.md
Remove the obsolete toggle-controller path, keep the issue-3 mouse toggle characterization, derive Settings copy from the canonical shortcut, and document deterministic and native acceptance boundaries for the full issue #82 contract.

Plan: .omo/plans/issue-82-global-hotkey.md
Treat only unmodified Escape as recorder cancellation, preserve modified Escape as a valid key code, and apply Launch at Login before shortcut replacement so a failed shortcut cannot leave registration and settings out of sync. Add the issue #12 compatibility and dogfood handoff matrix with explicit native INCONCLUSIVE boundaries.

Plan: .omo/plans/issue-82-global-hotkey.md
Point the deterministic and issue #12 handoff matrices at the final-SHA recorder evidence, including modified Escape as a valid candidate.

Plan: .omo/plans/issue-82-global-hotkey.md
Point the deterministic and issue #12 handoff matrices at the final native build, launch, and permission-boundary receipts.

Plan: .omo/plans/issue-82-global-hotkey.md
Point the issue #82 and issue #12 handoff matrices at the final verification, recorder, and native receipts that will be bound to the final review SHA.

Plan: .omo/plans/issue-82-global-hotkey.md
Persist the candidate through ShortcutConfigurationTransaction before publishing new in-memory settings, so shortcut registration and stored settings cannot diverge across the later settings update path.

Plan: .omo/plans/issue-82-global-hotkey.md
Point the issue #82 and issue #12 handoff matrices at the final verification and native receipts after the settings persistence fix.

Plan: .omo/plans/issue-82-global-hotkey.md
@douglasjarquin
douglasjarquin merged commit c7441f9 into main Aug 18, 2026
1 check passed
@douglasjarquin
douglasjarquin deleted the codex/issue-82 branch August 18, 2026 15:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[V1 Phase 0 · P0] Make the global hotkey press-and-hold reliable

1 participant